

//#include "StdAfx.h"
#include "Date.h"
#include "DateUtils.h"
#include <iostream>
#include "EightFontUtil.h"

using namespace std;








/**
 * 判断五行的相生相克
 * @param wo_wuxing 我的五行
 * @param ta_wuxing ta的五行
 * @return 1我生，2生我，3我克，4克我，5我同
 */
const int relation(string firstElement5, string secondElement5){
    const char* xiangsheng[] = { "金水", "水木", "木火", "火土", "土金", "金木", "木土", "土水", "水火", "火金" };
    int result = 0;
    //4，5，6，9，6，     3，7，8，7，5
    if (firstElement5 == secondElement5){
        
        return 5;
    }
    else{
        int cnt = sizeof(xiangsheng) / sizeof(char*);
        bool flag = false;
        for (int i = 0; i<cnt; i++){
            if (xiangsheng[i] == (firstElement5 + secondElement5)){
                if (i<5){//小于5的是相生关系
                    result = 1;
                }
                else{//其它是相克的关系
                    result = 3;
                }
                flag = true;
                break;
            }
        }
        if (!flag){
            for (int i = 0; i<cnt; i++){
                if (xiangsheng[i] == (secondElement5 + firstElement5)){
                    if (i<5){
                        result = 2;
                    }
                    else{
                        result = 4;
                    }
                    flag = true;
                    break;
                }
            }
        }
        
    }
    
    return result;
}


/**
 * 判断两个属性打架的输赢
 * @param relation
 * @return
 */
const bool getBigSmall(string first_wuxing, string second_wuxing){
    int relat = relation(first_wuxing, second_wuxing);
    //System.out.println(relation);
    bool winOrLose = false;
    //1我生，2生我，3我克，4克我，5我同
    switch (relat) {
        case 1:
            winOrLose = false;
            break;
        case 2:
            winOrLose = true;
            break;
        case 3:
        case 5:
            winOrLose = true;
            break;
        case 4:
            winOrLose = false;
            break;
        default:
            winOrLose = false;
            break;
    }
    //cout << "#######################relat#######################" << endl; // prints Hello World!!!
    //cout << relat << endl; // prints Hello World!!!
    return winOrLose;
}

/*
 *获取日子的名称
 *birthDate生日
 *x_date要求的日子
 */
const  char* getDayNameNew(const Date& date, const Date& birthDate){
    
    //甲子
    const char*  jiazis[] = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸", "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
    //甲子对应的五行
    const char* wuxings[] = { "木", "木", "火", "火", "土", "土", "金", "金", "水", "水", "水", "土", "木", "木", "土", "火", "火", "土", "金", "金", "土", "水" };
    //对应的日子名称
    const char* dayNames[] =
    {
        "比肩", "劫财", "食神", "伤官", "偏财", "正财", "偏官", "正官", "偏印", "正印", "正印", "正财", "比肩", "劫财", "偏财", "食神", "伤官", "正财", "偏官", "正官", "偏财", "偏印",
        "劫财", "比肩", "伤官", "食神", "正财", "偏财", "正官", "偏官", "正印", "偏印", "偏印", "偏财", "劫财", "比肩", "正财", "伤官", "食神", "偏财", "正官", "偏官", "正财", "正印",
        "偏印", "正印", "比肩", "劫财", "食神", "伤官", "偏财", "正财", "偏官", "正官", "正官", "伤官", "偏印", "正印", "食神", "比肩", "劫财", "伤官", "偏财", "正财", "食神", "偏官",
        "正印", "偏印", "劫财", "比肩", "伤官", "食神", "正财", "偏财", "正官", "偏官", "偏官", "食神", "正印", "偏印", "伤官", "劫财", "比肩", "食神", "正财", "偏财", "伤官", "正官",
        "偏官", "正官", "偏印", "正印", "比肩", "劫财", "食神", "伤官", "偏财", "正财", "正财", "劫财", "偏官", "正官", "比肩", "偏印", "正印", "劫财", "食神", "伤官", "比肩", "偏财",
        "正官", "偏官", "正印", "偏印", "劫财", "比肩", "伤官", "食神", "正财", "偏财", "偏财", "比肩", "正官", "偏官", "劫财", "正印", "偏印", "比肩", "伤官", "食神", "劫财", "正财",
        "偏财", "正财", "偏官", "正官", "偏印", "正印", "比肩", "劫财", "食神", "伤官", "伤官", "正印", "偏财", "正财", "偏印", "偏官", "正官", "正印", "比肩", "劫财", "偏印", "食神",
        "正财", "偏财", "正官", "偏官", "正印", "偏印", "劫财", "比肩", "伤官", "食神", "食神", "偏印", "正财", "偏财", "正印", "正官", "偏官", "偏印", "劫财", "比肩", "正印", "伤官",
        "食神", "伤官", "偏财", "正财", "偏官", "正官", "偏印", "正印", "比肩", "劫财", "劫财", "正官", "食神", "伤官", "偏官", "偏财", "正财", "正官", "偏印", "正印", "偏官", "比肩",
        "伤官", "食神", "正财", "偏财", "正官", "偏官", "正印", "偏印", "劫财", "比肩", "比肩", "偏官", "伤官", "食神", "正官", "正财", "偏财", "偏官", "正印", "偏印", "正官", "劫财"
        
    };
    
    
    
    int daySB = getDaySB(date);
    int birthDaySterm = getDaySB(birthDate);
    
    //要算的日子的日柱
    const char * jiazi_x_day = getSBName(daySB);
    
    //生日的日柱(甲辰)
    const char * jiazi_bir_day = getSBName(birthDaySterm);
    
    int cnt = sizeof(jiazis) / sizeof(char*);
    int line_index = -1;//行索引--->第几行
    int column = 0;//列索引--->第几列
    int firstElementIndex = -1;//要求日子的第一个五行属性索引
    int secondElementIndex = -1;//要求日子的第二个五行属性索引
    
    //substr截取字符串函数，第一个参数是从第几个开始，第二个参数是截取几个字符，（gb2312）一个汉字两个字符，所以截取第一个汉字就传(0, 2)
    //string jiazi_bir_day_first = string(jiazi_bir_day).substr(0, 2);
    //string jiazi_x_day_first = string(jiazi_x_day).substr(0, 2);
    //string jiazi_x_day_second = string(jiazi_x_day).substr(2, 2);
    //以下是utf-8环境使用的字符串截取，一个汉字占3个字符（安卓、ios用下面的方式）
    string jiazi_bir_day_first = mySubstr(jiazi_bir_day,0);
    string jiazi_x_day_first = mySubstr(jiazi_x_day,0);
    string jiazi_x_day_second = mySubstr(jiazi_x_day,1);
    
    //cout << jiazi_bir_day[0] << endl; // 打印第一个字符!
    //cout << jiazi_bir_day[1] << endl; // 打印第二个字符!
    
    for (int i = 0; i < cnt; i++){
        if (jiazi_bir_day_first == string(jiazis[i])){
            
            line_index = i;
            
        }
        if (jiazi_x_day_first == string(jiazis[i])){
            firstElementIndex = i;
        }
        
        if (jiazi_x_day_second == string(jiazis[i])){
            
            secondElementIndex = i;
            
            
        }
        
        
    }
    
    
    
    bool isBig = getBigSmall(string(wuxings[firstElementIndex]), string(wuxings[secondElementIndex]));
    if (isBig){
        column = firstElementIndex;
    }
    else{
        column = secondElementIndex;
    }
    
    return   dayNames[line_index * 22 + column];
    
}

/*
 *自定义切割字符（为了处理不同编码下中文所占的字符长度不一样）
 *src_str 原字符串
 *pos要切割的第几位
 */
const string mySubstr(const char * src_str, int pos){
    string str = string(src_str);//一串包含汉字的字串  
    //cin >> str;
    string strChar;//str中的汉字,要输出的字符串  
    
    char chr = str[0];
    bool flag = (chr & 0xC0) == 0xC0;
    cout << flag << endl; // 打印第二个字符!
    //chr是0xxx xxxx，即ascii码  
    if ((chr & 0x80) == 0)
    {
        strChar = str.substr(1 * pos, 1);
        cout << strChar;
        
    }//chr是1111 1xxx  
    else if ((chr & 0xF8) == 0xF8)
    {
        strChar = str.substr(5 * pos, 5 );
        cout << strChar;
    }//chr是1111 xxxx  
    else if ((chr & 0xF0) == 0xF0)
    {
        strChar = str.substr(4 * pos, 4);
        cout << strChar;
    }//chr是111x xxxx  
    else if ((chr & 0xE0) == 0xE0)
    {
        strChar = str.substr(3 * pos, 3);
        cout << strChar;
    }//chr是11xx xxxx  
    else if ((chr & 0xC0) == 0xC0)
    {
        strChar = str.substr(2 * pos, 2);
        cout << strChar;
    }
    else{
        strChar = str.substr(2 * pos, 2);
    }
    cout << endl;
    return strChar;
    
}


